<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> 
    <title> - 天地维杰网</title>
    <meta name="keywords" content="系统架构,shutdown,不与天斗,Domino,博客,程序员,架构师,笔记,技术,分享,java,Redis">
    
    <meta property="og:title" content="">
    <meta property="og:site_name" content="天地维杰网">
    <meta property="og:image" content="/img/author.jpg"> 
    <meta name="title" content=" - 天地维杰网" />
    <meta name="description" content="天地维杰网 | 博客 | 软件 | 架构 | Java "> 
    <link rel="shortcut icon" href="http://www.shutdown.cn/img/favicon.ico" />
    <link rel="apple-touch-icon" href="http://www.shutdown.cn/img/apple-touch-icon.png" />
    <link rel="apple-touch-icon-precomposed" href="http://www.shutdown.cn/img/apple-touch-icon.png" />
    <link href="http://www.shutdown.cn/js/vendor/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />
    <link href="http://www.shutdown.cn/js/vendor/fancybox/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />
    <link href="http://www.shutdown.cn/css/main.css" rel="stylesheet" type="text/css" />
    <link href="http://www.shutdown.cn/css/syntax.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" id="hexo.configuration">
  var NexT = window.NexT || {};
  var CONFIG = {
    scheme: 'Pisces',
    sidebar: {"position":"left","display":"post"},
     fancybox: true, 
    motion: true
  };
</script>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7826003325059020" crossorigin="anonymous"></script>
</head>
<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">
<div class="container one-collumn sidebar-position-left page-home  ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"> <div class="site-meta  custom-logo ">

  <div class="custom-logo-site-title">
    <a href="http://www.shutdown.cn"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">天地维杰网</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle">人如秋鸿来有信，事若春梦了无痕</p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
    <ul id="menu" class="menu">
      
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />首页
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/redis/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-battery-full"></i> <br />Redis
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/java/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-coffee"></i> <br />java
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/linux/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-linux"></i> <br />linux
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/daily/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-bug"></i> <br />日常问题
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/spring/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-child"></i> <br />Spring和Springboot
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/mac/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-fire"></i> <br />Mac相关
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/middleware/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-gavel"></i> <br />中间件
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/jiagou/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-rocket"></i> <br />架构
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/python/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-ship"></i> <br />python
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/front/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-bolt"></i> <br />前端
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/jvm/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-balance-scale"></i> <br />jvm
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/c/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-battery-empty"></i> <br />c语言
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/web3/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-web3"></i> <br />web3
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/post/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />归档
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/about/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />关于
          </a>
        </li>
      
      <li class="menu-item menu-item-search">
        <a href="javascript:;" class="popup-trigger"> <i class="menu-item-icon fa fa-search fa-fw"></i> <br /> 搜索</a>
      </li>
    </ul>
    <div class="site-search">
      <div class="popup">
 <span class="search-icon fa fa-search"></span>
 <input type="text" id="local-search-input">
 <div id="local-search-result"></div>
 <span class="popup-btn-close">close</span>
</div>

    </div>
</nav>

 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            
<section id="posts" class="posts-expand">
  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
    <header class="post-header">
      <h1 class="post-title" itemprop="name headline">
        <a class="post-title-link" href="http://www.shutdown.cn/post/redis7.0%E7%89%88%E6%9C%AC%E4%BB%8B%E7%BB%8D/" itemprop="url">
        
        </a>
      </h1>
      <div class="post-meta">
      <span class="post-time">
<span class="post-meta-item-icon">
    <i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">时间：</span>
<time itemprop="dateCreated" datetime="2016-03-22T13:04:35+08:00" content="0001-01-01">
    0001-01-01
</time>
</span> 
      
      
       <span>
&nbsp; | &nbsp;
<span class="post-meta-item-icon">
    <i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">阅读：</span>
<span class="leancloud-visitors-count">2460 字 ~12分钟</span>
</span>
      </div>
    </header>
    <div class="post-body" itemprop="articleBody">
    

    

<blockquote>
<p>原文地址：<a href="https://raw.githubusercontent.com/antirez/redis/7.0/00-RELEASENOTES">https://raw.githubusercontent.com/antirez/redis/7.0/00-RELEASENOTES</a></p>
</blockquote>

<h1 id="introduction-to-the-redis-7-0-release">Introduction to the Redis 7.0 release</h1>

<blockquote>
<p>redis7.0版本介绍</p>
</blockquote>

<p>Redis 7.0 includes several new user-facing features, significant performance optimizations, and many other improvements. It also includes changes that potentially break backwards compatibility with older versions. We urge users to review the release notes carefully before upgrading.</p>

<blockquote>
<p>Redis7.0引入了一些新的面向用户的特性，重要的性能优化和一些其他的提升。它还包括一些可能会破坏旧版本的兼容性的更改。我们建议用户在升级之前仔细阅读发布说明。</p>
</blockquote>

<p>In particular, users should be aware of the following changes:
&gt; 用户应特别注意一下变更：</p>

<ol>
<li>Redis 7 stores AOF as multiple files in a folder; see Multi-Part AOF below.
&gt; Redis 7 将 AOF文件以多文件的形式存储到一个文件夹中；参考下面的 Multi-Part AOF 说明。</li>
<li>Redis 7 uses a new version 10 format for RDB files, which is incompatible  with older versions.
&gt; Redis7受用了一个新版本10的RDB文件格式，这与旧版本不兼容。</li>
<li>Redis 7 converts ziplist encoded keys to listpacks on the fly when loading an older RDB format. Conversion applies to loading a file from disk or replicating from a Redis master and will lightly increase loading time.
&gt; Redis7在加载旧版本的RDB格式文件时，自动将ziplist编码的键转换为listpacks。转换在从磁盘加载文件或从Redis master同步数据时触发，会略微增加加载时间。</li>
<li>See sections about breaking changes mentioned below.
&gt; 参考下面的破坏性变更说明。</li>
</ol>

<p>Here is a comprehensive list of changes in this release compared to 6.2.6.
  &gt; 下面是本发布与6.2.6的比较。</p>

<p>Each one includes the PR number that added it so that you can get more details at <a href="https://github.com/redis/redis/pull/">https://github.com/redis/redis/pull/</a><number>
  &gt; 每个都包含了PR号，以便从<a href="https://github.com/redis/redis/pull/">https://github.com/redis/redis/pull/</a><number>查看更详细的信息。</p>

<h1 id="新特性">新特性</h1>

<ul>
<li>Redis Functions: A new way to extend Redis with server-side scripts (#8693)
see <a href="https://redis.io/topics/functions-intro">https://redis.io/topics/functions-intro</a>
&gt; Redis函数：新增了一种方式，用于扩展Redis服务端脚本（#8693） 参考：<a href="https://redis.io/topics/functions-intro">https://redis.io/topics/functions-intro</a></li>
<li>ACL: Fine-grained key-based permissions and allow users to support multiple sets of command rules with selectors (#9974)
see <a href="https://redis.io/topics/acl#key-permissions">https://redis.io/topics/acl#key-permissions</a> and <a href="https://redis.io/topics/acl#selectors">https://redis.io/topics/acl#selectors</a>.
&gt; ACL：精细化的键基于权限，并支持多个命令规则的选择器（#9974） 参考：<a href="https://redis.io/topics/acl#key-permissions">https://redis.io/topics/acl#key-permissions</a> and <a href="https://redis.io/topics/acl#selectors">https://redis.io/topics/acl#selectors</a>.</li>
<li>Cluster: Sharded (node-specific) Pub/Sub support (#8621)
see <a href="https://redis.io/topics/pubsub#sharded-pubsub">https://redis.io/topics/pubsub#sharded-pubsub</a>
&gt; 集群：分片（节点特定）的Pub/Sub支持（#8621） 参考：<a href="https://redis.io/topics/pubsub#sharded-pubsub">https://redis.io/topics/pubsub#sharded-pubsub</a></li>
<li>First-class handling of sub-commands in most contexts (affecting ACL categories, INFO commandstats, etc.) (#9504, #10147)
&gt; 在大多数上下文中将子命令当做一级命令处理（影响ACL类别，INFO命令统计等）（#9504，#10147）</li>
<li>Command metadata and documentation (#10104)
see <a href="https://redis.io/commands/command-docs">https://redis.io/commands/command-docs</a>, <a href="https://redis.io/topics/command-tips">https://redis.io/topics/command-tips</a>
&gt; 命令元数据和文档（#10104） 参考：<a href="https://redis.io/commands/command-docs">https://redis.io/commands/command-docs</a>, <a href="https://redis.io/topics/command-tips">https://redis.io/topics/command-tips</a></li>
<li>Command key-specs. A better way for clients to locate key arguments and their read/write purpose (#8324, #10122, #10167)
see <a href="https://redis.io/topics/key-specs">https://redis.io/topics/key-specs</a>
&gt; 命令键规格。更便于客户端定位key参数及其读写目的（#8324，#10122，#10167） 参考：<a href="https://redis.io/topics/key-specs">https://redis.io/topics/key-specs</a></li>
<li>Multi-Part AOF mechanism to avoid AOF rewrite overheads (#9788)
&gt; 多文件AOF机制，避免AOF重写开销（#9788）</li>
<li>Cluster: Support for hostnames, instead of IP addresses only (#9530)
&gt; 集群：支持主机名，而不是只支持IP地址（#9530）</li>
<li>Improved management of memory consumed by network buffers, and an option to drop clients when total memory exceeds a limit  (#8687)
&gt; 网络缓冲区内存消耗管理改进，和当总内存超过一定限制时，丢弃客户端的选项（#8687）</li>
<li>Cluster: A mechanism for disconnecting cluster bus connections to prevent uncontrolled buffer growth (#9774)
&gt; 集群：一种机制，用于断开集群总线连接，防止无控制的缓冲区增长（#9774）</li>
<li>AOF: Timestamp annotations and support for point-in-time recovery (#9326)
&gt; AOF：时间戳注释和支持时间点恢复（#9326）</li>
<li>Lua: support Function flags in EVAL scripts (#10126)
see <a href="https://redis.io/topics/eval-intro#eval-flags">https://redis.io/topics/eval-intro#eval-flags</a>
&gt; Lua：支持EVAL脚本的函数标记（#10126） 参考：<a href="https://redis.io/topics/eval-intro#eval-flags">https://redis.io/topics/eval-intro#eval-flags</a></li>
<li>Lua: Support RESP3 reply for Verbatim and Big-Number types (#9202)
&gt; Lua：支持逐字和大数字类型的RESP3回复（#9202）</li>
<li>Lua: Get Redis version via redis.REDIS_VERSION, redis.REDIS_VERSION_NUM (#10066)
&gt; Lua：通过redis.REDIS_VERSION，redis.REDIS_VERSION_NUM获取Redis版本（#10066）</li>
</ul>

<h2 id="new-user-commands-or-command-arguments">New user commands or command arguments</h2>

<blockquote>
<p>新的用户命令或命令参数</p>
</blockquote>

<ul>
<li>ZMPOP, BZMPOP commands (#9484)</li>
<li>LMPOP, BLMPOP commands (#9373)</li>
<li>SINTERCARD, ZINTERCARD commands (#8946, #9425)</li>
<li>SPUBLISH, SSUBSCRIBE, SUNSUBSCRIBE, PUBSUB SHARDCHANNELS/SHARDNUMSUB (#8621)</li>
<li>EXPIRETIME and PEXPIRETIME commands (#8474)</li>
<li>EXPIRE command group supports NX/XX/GT/LT options (#2795)
&gt; EXPIRE命令组支持 NX/XX/GT/LT选项（#2795）</li>
<li>SET command supports combining NX and GET flags (#8906)
&gt; SET命令支持合并 NX和GET标记（#8906）</li>
<li>BITPOS, BITCOUNT accepts BIT index (#9324)
&gt; BITPOS，BITCOUNT接受BIT索引（#9324）</li>
<li>EVAL_RO, EVALSHA_RO command variants, to run on read-only replicas (#8820)
&gt; EVAL_RO，EVALSHA_RO命令变体，用于在只读副本上运行（#8820）</li>
<li>SORT_RO command, to run on read-only replicas (#9299)
&gt; SORT_RO命令，用于在只读副本上运行（#9299）</li>
<li>SHUTDOWN arguments: NOW, FORCE, ABORT (#9872)</li>
<li>FUNCTION *, FCALL, FCALL_RO - <a href="https://redis.io/commands/function-load">https://redis.io/commands/function-load</a></li>
<li>CONFIG SET/GET can handle multiple configs atomically, in one call (#9748, #9914)
&gt; CONFIG SET/GET可以在一次调用中原子性地处理多个配置（#9748，#9914）</li>
<li>QUIT promoted to be a proper command, HOST: and POST demoted (#9798)
&gt; QUIT提升为一个真正的命令，HOST：和POST被降级（#9798）</li>
<li>XADD supports auto sequence number via <ms>-* (#9217)
&gt; XADD支持通过 <code>&lt;ms&gt;-*</code>自动序列号（#9217）</li>
</ul>

<h2 id="new-administrative-and-introspection-commands-and-command-arguments">New administrative and introspection commands and command arguments</h2>

<blockquote>
<p>新的管理命令、内省命令和命令参数</p>
</blockquote>

<ul>
<li>COMMAND DOCS (#9656, #10056, #10104)</li>
<li>COMMAND LIST (#9504)</li>
<li>COMMAND INFO accepts sub-commands as args, and no args too (#9504, #10056)</li>
<li>LATENCY HISTOGRAM (#9462)</li>
<li>CLUSTER LINKS (#9774)</li>
<li>CLUSTER DELSLOTSRANGE and CLUSTER ADDSLOTSRANGE (#9445)</li>
<li>CLIENT NO-EVICT (#8687)</li>
<li>ACL DRYRUN (#9974)</li>
<li>SLOWLOG GET supports passing in -1 to get all entries (#9018)</li>
</ul>

<h2 id="command-replies-that-have-been-extended">Command replies that have been extended</h2>

<blockquote>
<p>命令回复已扩展</p>
</blockquote>

<ul>
<li>COMMAND and COMMAND INFO extended with tips, key-specs and sub-commands
see <a href="https://redis.io/commands/command">https://redis.io/commands/command</a>
&gt; <code>COMMAND</code>命令和<code>COMMAND INFO</code>命令扩展了 说明、键规格和子命令，参考：<a href="https://redis.io/commands/command">https://redis.io/commands/command</a></li>
<li>ACL CAT, COMMAND LIST list sub-commands (#10127)
&gt; ACL CAT，COMMAND LIST列出子命令（#10127）</li>
<li>MODULE LIST reply includes path and args (#4848)
&gt; MODULE LIST回复包括路径和参数（#4848）</li>
<li>OBJECT ENCODING returns listpack instead of ziplist (#8887, #9366)
&gt; OBJECT ENCODING返回listpack而不是ziplist（#8887，#9366）</li>
<li>CLUSTER SLOTS hostname support (#9530)
&gt; CLUSTER SLOTS支持主机名（#9530）</li>
<li>COMMAND command: Added the <code>blocking</code> and <code>module</code> flags (#10104, #9656)
&gt; COMMAND命令：添加了<code>blocking</code>和<code>module</code>标记（#10104，#9656）</li>
</ul>

<h1 id="potentially-breaking-changes">Potentially Breaking Changes</h1>

<blockquote>
<p>可能有破坏性的改动</p>
</blockquote>

<ul>
<li>Modifying the bind parameter to a non-default value will no longer implicitly disable protected-mode (#9034)
&gt; 修改<code>bind</code>参数为非默认值将不再隐式禁用保护模式（#9034）</li>
<li>Remove EVAL script verbatim replication, propagation, and deterministic execution logic (#9812)
This has been deprecated and off by default since Redis 6 and is no longer supported.
&gt; 删除EVAL脚本逐字复制、传播和确定性执行逻辑（#9812）</li>
<li>ACL: pub/sub channels are blocked by default (acl-pubsub-default=resetchannels) (#10181)
&gt; ACL：pub/sub 频道默认为阻塞（acl-pubsub-default=resetchannels）（#10181）</li>

<li><p>SCRIPT LOAD and SCRIPT FLUSH are no longer propagated to replicas / AOF (#9812)
&gt; SCRIPT LOAD和SCRIPT FLUSH不再传播到副本/AOF（#9812）</p></li>

<li><p>ACL: Declarations of duplicate ACL users in startup files and command line
arguments will result in an error, whereas previously the last declaration
would overwrite the others. (#9330)
&gt; ACL: 启动文件和命令行中的重复的ACL用户声明会然会错误结果，之前的最后声明将覆盖其他。（#9330）</p></li>

<li><p>Replication: TTLs are always replicated as absolute (not relative) millisecond
timestamps (#8474)
&gt; 副本：副本复制的TTLs始终为绝对毫秒时间戳（而不是相对的）（#8474）在生成rdb时，会将TTL转换为(unix time + ttl)生成的绝对时间戳。</p></li>

<li><p>Fixes in handling multi-key commands with expired keys on writable replicas (#9572)
&gt; 修复在可写副本上复合键处理命令对过期键的处理（#9572）</p></li>

<li><p>CONFIG SET maxmemory returns before starting eviction (#10019)
&gt; CONFIG SET maxmemory在开始淘汰前返回（#10019）</p></li>

<li><p>AOF: The new Multi-Part mechanism stores data as a set of multiple files in a
designated folder (#9788)
&gt; AOF：新的分块机制将数据存储为存储在指定的文件夹的多个文件的集合（#9788）</p></li>

<li><p>Remove STRALGO command, preserve LCS a standalone command which only works on
keys (#9799)
&gt; 删除STRALGO命令，只保留一个LCS命令只作用于键上（#9799）</p></li>

<li><p>Remove gopher protocol support (#9057)
&gt; 删除gopher协议支持（#9057）</p></li>

<li><p>MODULE and DEBUG commands disabled (protected) by default, for better security (#9920)
&gt; MODULE和DEBUG命令默认禁用，为了更好的安全性（#9920）</p></li>

<li><p>Snapshot-creating and other admin commands in MULTI/EXEC transactions are now rejected (#10015)
&gt; 在MULTI/EXEC事务中现在会拒绝创建快照和调用其他管理命令（#10015）</p></li>

<li><p>PING is now rejected with -MASTERDOWN when replica-serve-stale-data=no (#9757)
&gt; PING命令现在在replica-serve-stale-data=no时被拒绝并返回  -MASTERDOWN（#9757）</p></li>

<li><p>ACL GETUSER reply now uses ACL syntax for <code>keys</code> and <code>channels</code> (#9974)
&gt; ACL GETUSER回复现在使用ACL语法来表示<code>keys</code>和<code>channels</code>（#9974）</p></li>

<li><p>COMMAND reply drops <code>random</code> and <code>sort-for-scripts</code> flags, which are now part of command tips (#10104)
&gt; COMMAND命令回复删除了<code>random</code>和<code>sort-for-scripts</code>标记，这现在是<code>command tips</code>的一部分（#10104）</p></li>

<li><p>LPOP/RPOP with count against non-existing list return null array (#10095)
&gt; LPOP/RPOP带数量参数操作不存在的list集合返回空数组（#10095）</p></li>

<li><p>INFO commandstats now shows the stats per sub-command (#9504)
&gt; INFO 命令统计功能现在显示每个子命令的统计（#9504）</p></li>

<li><p>ZPOPMIN/ZPOPMAX used to produce wrong replies when count is 0 with non-zset (#9711)
&gt; ZPOPMIN/ZPOPMAX过去在key不是zset且count为0时产生错误的回复（#9711），现在类型不正确会返回类型错误，count &lt; 0  时会提示count要为正数</p></li>

<li><p>LPOP/RPOP used to produce wrong replies when count is 0 (#9692)
&gt; LPOP/RPOP当count为0时产生错误的回复，原来会返回nil，现在返回空数组（#9692）</p></li>

<li><p>CONFIG GET bind now returns the current value in effect, even if the implicit default is in use (#9034)
&gt; <code>CONFIG GET bind</code> 现在会返回当前生效的值，即使是隐式使用的（#10021）</p></li>

<li><p>CONFIG REWRITE now rewrites the list of modules to load (#4848)
&gt; CONFIG REWRITE现在会重写加载模块的列表（#4848）</p></li>

<li><p>Config: repl-diskless-sync is now set to yes by default (#10092)
&gt; Config：repl-diskless-sync现在默认设置为yes（#10092）</p></li>

<li><p>When shutting down, Redis can optionally wait for replicas to catch up on the replication link (#9872)
&gt; 在关闭的时候，redis可以选择性地等待副本抓取到同步链接（#9872）</p></li>

<li><p>Most CONFIG SET, REWRITE, RESETSTAT commands are now allowed during loading (#9878)
&gt; CONFIG SET, REWRITE, RESETSTAT命令现在可以在加载的时候使用（#9878）</p></li>

<li><p>READONLY and READWRITE commands are now allowed when loading and on stale replicas (#7425)
&gt; READONLY和READWRITE命令现在可以在加载和过时的副本上使用（#7425）</p></li>

<li><p>Fix ACL category for SELECT, WAIT, ROLE, LASTSAVE, READONLY, READWRITE, ASKING (#9208)
&gt; 修复 SELECT, WAIT, ROLE, LASTSAVE, READONLY, READWRITE, ASKING 的ACL类别（#9208）</p></li>

<li><p>RESET is now allowed even when on unauthenticated connections (#9798)
&gt; RESET命令现在可以在未认证的连接上使用（#9798）</p></li>

<li><p>SCRIPT LOAD is now allowed on stale replicas (#10126)
&gt; SCRIPT LOAD现在可以在过时的副本上使用（#10126）</p></li>
</ul>

<h1 id="security-improvements">Security improvements</h1>

<blockquote>
<p>安全改进</p>
</blockquote>

<ul>
<li>Sensitive configs and commands blocked (protected) by default (#9920)
&gt; 默认禁用的敏感配置和命令（#9920），以下三个配置默认设置为no，只能通过修改配置文件进行修改，如果修改为yes或者是local，则可以通过<code>config set</code> 命令进行修改

<ul>
<li>enable-protected-configs -  dbfilename, and dir configs</li>
<li>enable-debug-command - block the DEBUG command</li>
<li>enable-module-command - block the MODULE command</li>
</ul></li>
<li>Improve bind and protected-mode config handling (#9034)
&gt; 改进bind和protected-mode配置处理（#9034）</li>
<li>Sentinel: avoid logging auth-pass value (#9652)
&gt; Sentinel：避免记录auth-pass值（#9652）</li>
<li>redis-cli: sensitive commands bypass the history file (#8895)
&gt; redis-cli：敏感命令绕过历史文件（#8895），就是说，redis-cli可以执行敏感命令，但是不会记录到历史文件中，如执行<code>config set requirepass 123456</code>命令后，在使用上下方向键翻历史时，是看不到<code>config set requirepass</code>的这条历史记录的，其他的诸是<code>auth</code>命令也一样。</li>
</ul>

<h1 id="performance-and-resource-utilization-improvements">Performance and resource utilization improvements</h1>

<blockquote>
<p>性能和资源利用改进</p>
</blockquote>

<ul>
<li>Significant memory saving and latency improvements in cluster mode (#9356)
&gt; 集群模式下的显著的节省内存并降低延迟（#9356）</li>
<li>Significant memory savings in case of many hash or zset keys (#9228)
&gt; 大量hash和zset场景下显著节省内存（#9228）</li>
<li>Replication backlog and replicas use one global shared replication buffer (#9166)
&gt; 同步积压缓冲区和副本使用一个全局共享的同步缓冲区（#9166）</li>
<li>Significant reduction of copy-on-write memory overheads (#8974)
&gt; 显著降低copy-on-write内存开销（#8974）</li>
<li>Free unused capacity in the cluster send buffer (#9255)
&gt; 释放集群总线发送缓冲区未使用的容量（#9255）</li>
<li>Memory efficiency, make full use of client struct memory for reply buffers (#8968)
&gt; 内存效率，充分利用客户端结构内存进行回复缓冲(#8968）</li>
<li>Replace ziplist with listpack in Hash, List, Zset (#8887, #9366, #9740)
&gt; 将 Hash、List、Zset 的 ziplist 替换为 listpack（#8887，#9366，#9740）</li>
<li>Add support for list type to store elements larger than 4GB (#9357)
&gt; 添加支持列表类型来存储大于4GB的元素（#9357）</li>
<li>Reuse temporary client objects for blocked clients by module (#9940)
&gt; 通过模块重用临时客户端对象（#9940）</li>
<li>Remove command argument count limit, dynamically grow argv buffer (#9528)
&gt; 删除命令参数数量限制，动态增长argv缓冲区（#9528）</li>
<li>Optimize list type operations to seek from the nearest end (#9454)
&gt; 优化列表类型操作从最近的端开始搜索（#9454）</li>
<li>Improvements in fsync to avoid large writes to disk (#9409)
&gt; 改进fsync以避免大量写入磁盘（#9409）</li>
<li>BITSET and BITFIELD SET only propagated when the value actually changed (#9403)
&gt; BITSET和BITFIELD SET只有在值实际变化时才会传播（#9403）</li>
<li>Improve latency when a client is unblocked by module timer (#9593)
&gt; 当客户端被模块定时器解除阻塞时，降低延迟（#9593）</li>
</ul>

<h1 id="other-general-improvements">Other General Improvements</h1>

<blockquote>
<p>其他一般改进</p>
</blockquote>

<ul>
<li>Make partial sync possible after master reboot (#8015)
&gt; 允许master节点重启后进行部分同步（#8015）</li>
<li>Always create a base AOF file when redis starts from empty (#10102)
&gt; 在redis启动时，总是创建一个基础的AOF文件（#10102）</li>
<li>Replica keep serving data during repl-diskless-load=swapdb for better availability (#9323)
&gt; 副本在repl-diskless-load=swapdb时继续服务数据，以提高可用性（#9323）</li>
</ul>

<h1 id="changes-in-cli-tools">Changes in CLI tools</h1>

<ul>
<li>redis-cli &ndash;json, and -2 options (#9954)
&gt; redis-cli &ndash;json和-2选项（#9954）</li>
<li>redis-cli &ndash;scan, add sleep interval option (#3751)
&gt; redis-cli &ndash;scan添加睡眠间隔选项（#3751）</li>
<li>redis-cli &ndash;replica optimization, skip RDB generation (#10044)
&gt; redis-cli &ndash;replica优化，跳过RDB生成（#10044）</li>
<li>redis-cli &ndash;functions-rdb, generate RDB with Functions only (#9968)
&gt; redis-cli &ndash;functions-rdb生成仅包含函数的RDB文件（#9968）</li>

<li><p>redis-cli -X, take an arbitrary arg from stdin, extend &ndash;cluster call take -x (#9980)
&gt; redis-cli -X，从stdin中获取一个任意参数，扩展&ndash;cluster调用添加-x选项（#9980）</p>

<p><code>-X</code>效果如下：通过<code>echo</code>向输入流中输入<code>mybasswd</code>值，redis-cli通过-X从输入流中获取值并赋值到<code>passwd_tag</code>变量中，然后被set到password这个key中。</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">  <span style="color:#ce5c00;font-weight:bold">[</span>root@redis-7-107 data<span style="color:#ce5c00;font-weight:bold">]</span><span style="color:#8f5902;font-style:italic"># echo mypasswd | redis-cli -p 7011 -X passwd_tag mset username myname password passwd_tag</span>
  OK
  <span style="color:#ce5c00;font-weight:bold">[</span>root@redis-7-107 data<span style="color:#ce5c00;font-weight:bold">]</span><span style="color:#8f5902;font-style:italic"># redis-cli -p 7011 get password</span>
  <span style="color:#4e9a06">&#34;mypasswd\n&#34;</span>
  <span style="color:#ce5c00;font-weight:bold">[</span>root@redis-7-107 data<span style="color:#ce5c00;font-weight:bold">]</span>#</code></pre></div></li>

<li><p>redis-benchmark -x takes an argument from stdin (#9130)
&gt; redis-benchmark -x从stdin中获取一个参数（#9130）</p></li>

<li><p>redis-benchmark, Added URI support (#9314)
&gt; redis-benchmark，添加URI支持（#9314）</p></li>

<li><p>redis-cli monitor and pubsub can be aborted with Ctrl+C, keeping the cli alive (#9347)
&gt; redis-cli monitor和pubsub可以通过Ctrl+C中断，保持cli连接不中断(#9347）在6.0版本中会直接中断cli连接并跳出的。</p></li>
</ul>

<h1 id="platform-toolchain-support-related-improvements">Platform / toolchain support related improvements</h1>

<blockquote>
<p>平台/工具链支持相关改进
* Upgrade jemalloc 5.2.1 (#9623)
    &gt; jemalloc升级为5.2.1（#9623）
* Fix RSS metrics on NetBSD and OpenBSD (#10116, #10149)
    &gt; 修复NetBSD和OpenBSD上的RSS指标（#10116，#10149）
* Check somaxconn system settings on macOS, FreeBSD and OpenBSD (#9972)
    &gt; 检查macos，freebsd和openbsd上的somaxconn系统设置（#9972）
* Better fsync on MacOS, improve power failure safety (#9545)
    &gt; 更好的fsync在macos上，提高电源故障安全性（#9545）</p>
</blockquote>

<h1 id="new-configuration-options">New configuration options</h1>

<blockquote>
<p>新配置项</p>
</blockquote>

<ul>
<li>CONFIG SET/GET can handle multiple configs in one call (#9748, #9914)
&gt; CONFIG SET/GET可以一次设置多个配置项（#9748，#9914）</li>
<li>Support glob pattern matching for config include files (#8980)
&gt; 支持配置文件引入的全局规则匹配模式（#8980）</li>
<li>appenddirname, folder where multi-part AOF files are stored (#9788)
&gt; appenddirname，保存多个AOF文件的文件夹（#9788）</li>
<li>shutdown-timeout, default 10 seconds (#9872)
&gt; shutdown-timeout，默认10秒（#9872）</li>
<li>maxmemory-clients, allows limiting the total memory usage by all clients (#8687)
&gt; maxmemory-clients，允许限制所有客户端的总内存使用（#8687）</li>
<li>cluster-port, can control the bind port of cluster bus (#9389)
&gt; cluster-port，可以控制集群总线的绑定端口（#9389）</li>
<li>bind-source-addr, configuration argument control IP of outgoing connections (#9142)
&gt; bind-source-addr，配置参数控制出口连接的IP（#9142）</li>
<li>busy-reply-threshold, alias for the old lua-time-limit (#9963)
&gt; busy-reply-threshold，旧的lua-time-limit选项的别名（#9963）</li>
<li>repl-diskless-sync-max-replicas, allows faster replication in some cases (#10092)
&gt; repl-diskless-sync-max-replicas，某些场景允许更快的复制（#10092）</li>

<li><p>latency-tracking, enabled by default, and latency-tracking-info-percentiles (#9462)
&gt; latency-tracking，默认开启，以及latency-tracking-info-percentiles选项。（#9462）
&gt; latency-tracking开启后可以通过<code>INFO LATENCYSTATS</code>命令查看延迟统计信息，latency-tracking-info-percentiles选项可以查看延迟统计信息的百分位数。默认为&rdquo;50 99 99.9&rdquo;</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">127.0.0.1:7011&gt; INFO LATENCYSTATS
<span style="color:#8f5902;font-style:italic"># Latencystats</span>
latency_percentiles_usec_info:p50<span style="color:#ce5c00;font-weight:bold">=</span>121.343,p99<span style="color:#ce5c00;font-weight:bold">=</span>188.415,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>188.415
latency_percentiles_usec_auth:p50<span style="color:#ce5c00;font-weight:bold">=</span>6.015,p99<span style="color:#ce5c00;font-weight:bold">=</span>18.047,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>18.047
latency_percentiles_usec_config<span style="color:#000;font-weight:bold">|</span>set:p50<span style="color:#ce5c00;font-weight:bold">=</span>15.039,p99<span style="color:#ce5c00;font-weight:bold">=</span>29.055,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>29.055
latency_percentiles_usec_config<span style="color:#000;font-weight:bold">|</span>get:p50<span style="color:#ce5c00;font-weight:bold">=</span>5.023,p99<span style="color:#ce5c00;font-weight:bold">=</span>23.039,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>23.039
latency_percentiles_usec_command<span style="color:#000;font-weight:bold">|</span>docs:p50<span style="color:#ce5c00;font-weight:bold">=</span>1003.519,p99<span style="color:#ce5c00;font-weight:bold">=</span>1261.567,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>1261.567
latency_percentiles_usec_hello:p50<span style="color:#ce5c00;font-weight:bold">=</span>5.023,p99<span style="color:#ce5c00;font-weight:bold">=</span>6.015,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>6.015
latency_percentiles_usec_scan:p50<span style="color:#ce5c00;font-weight:bold">=</span>6.015,p99<span style="color:#ce5c00;font-weight:bold">=</span>11.007,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>11.007
latency_percentiles_usec_monitor:p50<span style="color:#ce5c00;font-weight:bold">=</span>1.003,p99<span style="color:#ce5c00;font-weight:bold">=</span>1.003,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>1.003
latency_percentiles_usec_slowlog<span style="color:#000;font-weight:bold">|</span>get:p50<span style="color:#ce5c00;font-weight:bold">=</span>2.007,p99<span style="color:#ce5c00;font-weight:bold">=</span>10.047,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>10.047
latency_percentiles_usec_get:p50<span style="color:#ce5c00;font-weight:bold">=</span>3.007,p99<span style="color:#ce5c00;font-weight:bold">=</span>7.007,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>7.007
latency_percentiles_usec_set:p50<span style="color:#ce5c00;font-weight:bold">=</span>5.023,p99<span style="color:#ce5c00;font-weight:bold">=</span>18.047,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>18.047
latency_percentiles_usec_mset:p50<span style="color:#ce5c00;font-weight:bold">=</span>5.023,p99<span style="color:#ce5c00;font-weight:bold">=</span>5.023,p99.9<span style="color:#ce5c00;font-weight:bold">=</span>5.023
127.0.0.1:7011&gt; config get latency-tracking-info-percentiles
1<span style="color:#ce5c00;font-weight:bold">)</span> <span style="color:#4e9a06">&#34;latency-tracking-info-percentiles&#34;</span>
2<span style="color:#ce5c00;font-weight:bold">)</span> <span style="color:#4e9a06">&#34;50 99 99.9&#34;</span></code></pre></div></li>

<li><p>cluster-announce-hostname and cluster-preferred-endpoint-type (#9530)
&gt; cluster-announce-hostname and cluster-preferred-endpoint-type（#9530）效果如下</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">  127.0.0.1:7012&gt; config <span style="color:#204a87">set</span> cluster-announce-hostname gcache.gome.com.cn
  OK
  127.0.0.1:7012&gt; config get cluster-announce-hostname
  1<span style="color:#ce5c00;font-weight:bold">)</span> <span style="color:#4e9a06">&#34;cluster-announce-hostname&#34;</span>
  2<span style="color:#ce5c00;font-weight:bold">)</span> <span style="color:#4e9a06">&#34;gcache.gome.com.cn&#34;</span>
  127.0.0.1:7012&gt; cluster nodes
  b4b6a0a608ed9789937908e1b7feb65f7db57a44 127.0.0.1:7013@17013 master - <span style="color:#0000cf;font-weight:bold">0</span> <span style="color:#0000cf;font-weight:bold">1657090967314</span> <span style="color:#0000cf;font-weight:bold">2</span> connected 5461-10922
  75de31aa0e33cb647978d77e51fcbab93101ac56 127.0.0.1:7014@17014 master - <span style="color:#0000cf;font-weight:bold">0</span> <span style="color:#0000cf;font-weight:bold">1657090968328</span> <span style="color:#0000cf;font-weight:bold">3</span> connected 10923-16383
  5a5bdda0d956b317b309af8a29cbf8d7fe3652f0 127.0.0.1:7012@17012,gcache.gome.com.cn myself,master - <span style="color:#0000cf;font-weight:bold">0</span> <span style="color:#0000cf;font-weight:bold">1657090967000</span> <span style="color:#0000cf;font-weight:bold">1</span> connected 0-5460
  127.0.0.1:7012&gt;</code></pre></div></li>

<li><p>cluster-allow-pubsublocal-when-down (#8621)
&gt;  当设置为yes时，允许节点在集群处于下线状态时，只要它认为它拥有槽位，就可以服务pubsub shard负载。</p></li>

<li><p>cluster-link-sendbuf-limit (#9774)
&gt; Cluster link send buffer limit is the limit on the memory usage of an individual cluster bus link&rsquo;s send buffer in bytes
集群连接发送缓冲区限制是每个集群总线连接的发送缓冲区的内存使用量的限制。</p></li>

<li><p>list-max-listpack-<em>, hash-max-listpack-</em>, zset-max-listpack-* as aliases for the old ziplist configs (#8887, #9366, #9740)
&gt; list-max-listpack-*，hash-max-listpack-*，zset-max-listpack-*为旧的ziplist配置的别名（#8887，#9366，#9740）</p></li>
</ul>

<h1 id="info-fields-and-introspection-changes">INFO fields and introspection changes</h1>

<blockquote>
<p>INFO字段和介绍变化</p>
</blockquote>

<ul>
<li>INFO: latencystats section (#9462)</li>
<li>INFO: total_active_defrag_time and current_active_defrag_time (#9377)</li>
<li>INFO: total_eviction_exceeded_time and current_eviction_exceeded_time (#9031)</li>
<li>INFO: evicted_clients (#8687)</li>
<li>INFO: mem_cluster_links, total_cluster_links_buffer_limit_exceeded (#9774)</li>
<li>INFO: current_cow_peak (#8974)</li>
<li>INFO: Remove aof_rewrite_buffer_length (#9788)</li>
<li>MEMORY STATS: Report slot to keys map size in in cluster mode (#10017)</li>
<li>INFO MEMORY: changes to separate memory usage of Functions and EVAL (#9780)</li>
<li>INFO MEMORY: Add mem_total_replication_buffers, change meaning of
mem_clients_slaves (#9166)</li>
<li>CLIENT LIST: tot-mem, multi-mem (#8687)</li>
<li>CLIENT LIST, INFO: Show RESP version (#9508)</li>
<li>SENTINEL INFO: tilt_mode_since (#9000)</li>
<li>LATENCY: Track module-acquire-GIL latency (#9608)</li>
</ul>

<h1 id="module-api-changes">Module API changes</h1>

<ul>
<li>Add API for replying with RESP3 types (#8521, #9639, #9632)</li>
<li>Add API for parsing RESP3 replies from RM_Call (#9202)</li>
<li>Add RM_Call &lsquo;0&rsquo; and &lsquo;3&rsquo; flags to control RESP version to be used (#9202)</li>
<li>Add Support for validating ACL explicitly (#9309, #9974)</li>
<li>Add missing list type functionality APIs (#8439)</li>
<li>Add API for yielding to Redis events during long busy jobs (#9963)</li>
<li>Add API for registering other file descriptors to the Redis event loop (#10001)</li>
<li>Enhance mem_usage/free_effort/unlink/copy and IO callbacks to have key name
and DB index (#8999)</li>
<li>Enhance mem_usage callback to get the requested sample size (#9612)</li>
<li>RM_GetContextFlags: CTX_FLAGS_ASYNC_LOADING, CTX_FLAGS_RESP3 (#9323, #9202)</li>
<li>Mark APIs as non-experimental (#9983)</li>
<li>RM_CreateSubcommand (#9504)</li>
<li>RM_KeyExists (#9600)</li>
<li>RM_TrimStringAllocation (#9540)</li>
<li>RM_LoadDataTypeFromStringEncver (#9537)</li>
<li>RM_MonotonicMicroseconds (#10101)</li>
<li>Add ReplAsyncLoad event and deprecate the ReplBackup event (#9323)</li>
<li>Add RM_SetModuleOptions OPTIONS_HANDLE_REPL_ASYNC_LOAD flag (#9323)</li>
</ul>

<h1 id="bug-fixes">Bug Fixes</h1>

<ul>
<li>Fix COMMAND GETKEYS on EVAL without keys (#9733)</li>
<li>Improve MEMORY USAGE with allocator overheads (#9095)</li>
<li>Unpause clients after manual failover ends instead of waiting for timed (#9676)</li>
<li>Lua: fix crash on a script call with many arguments, a regression in v6.2.6 (#9809)</li>
<li>Lua: Use all characters to calculate string hash to prevent hash collisions (#9449)</li>
<li>Prevent LCS from allocating temp memory over proto-max-bulk-len (#9817)</li>
<li>Tracking: Make invalidation messages always after command&rsquo;s reply (#9422)</li>
<li>Cluster: Hide empty replicas from CLUSTER SLOTS responses (#9287)</li>
<li>CLIENT KILL killed all clients when used with ID of 0 (#9853)</li>
<li>Fix bugs around lists with list-compress-depth (#9849, #9779)</li>
<li>Fix one in a blue moon LRU bug in RESTORE, RDB loading, and module API (#9279)</li>
<li>Reset lazyfreed_objects info field with RESETSTAT, test for stream lazyfree (#8934)</li>
<li>Fix RDB and list node compression for handling values larger than 4GB (#9776)</li>
<li>Fix a crash when adding elements larger than 2GB to a Set or Hash (#9916)</li>
<li>Diskless replication could not count as a change and skip next database SAVE (#9323)</li>
<li>Fix excessive stream trimming due to an overflow (#10068)</li>
<li>Safe and organized exit when receiving SIGTERM while loading (#10003)</li>
<li>Improve EXPIRE TTL overflow detection (#9839)</li>
<li>Add missed error counting for INFO errorstats (#9646)</li>
<li>DECRBY LLONG_MIN caused negation overflow (#9577)</li>
<li>Delay discarding cached master when full synchronization (#9398)</li>
<li>Fix Stream keyspace notification and persistence triggers in consumer
creation and deletion (#9263)</li>
<li>Fix rank overflow in zset with more than 2B entries (#9249)</li>
<li>Avoid starting in check-aof / check-rdb / sentinel modes if only the folder
name contains that name (#9215, #9176)</li>
<li>create the log file only after done parsing the entire config file (#6741)</li>
<li>redis-cli: Fix SCAN sleep interval for &ndash;bigkeys, &ndash;memkeys, &ndash;hotkeys (#9624)</li>
<li>redis-cli: Fix prompt to show the right DB num and transaction state after
RESET (#9096)</li>
<li>Module API: fix possible propagation bugs in case a module calls CONFIG SET
maxmemory outside a command (#10019, #9890)</li>
<li>Module API: carry through client RESP version to module blocked clients (#9634)</li>
<li>Module API: release clients blocked on module commands in cluster resharding
and down state (#9483)</li>
<li>Sentinel: Fix availability after master reboot (#9438)</li>
<li>Sentinel: Fix memory leak with TLS (#9753)</li>
<li>Sentinel: Fix possible failover due to duplicate zero-port (#9240)</li>
<li>Sentinel: Fix issues with hostname support (#10146)</li>
<li>Sentinel: Fix election failures on certain container environments (#10197)</li>
</ul>

    </div>
    <footer class="post-footer">
     

     <div class="post-nav">
    <div class="post-nav-next post-nav-item">
    
        <a href="http://www.shutdown.cn/post/redis7.0%E6%96%B0%E7%89%B9%E6%80%A7-listpack%E6%9B%BF%E6%8D%A2ziplist/" rel="next" title="">
        <i class="fa fa-chevron-left"></i> 
        </a>
    
    </div>

    <div class="post-nav-prev post-nav-item">
    
        <a href="http://www.shutdown.cn/post/redission/" rel="prev" title="">
         <i class="fa fa-chevron-right"></i>
        </a>
    
    </div>
</div>
      
     
     
     






    </footer>
  </article>
</section>

          </div>
        </div>
        <div class="sidebar-toggle">
  <div class="sidebar-toggle-line-wrap">
    <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
    <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
    <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
  </div>
</div>
<aside id="sidebar" class="sidebar">
  <div class="sidebar-inner">

    <section class="site-overview sidebar-panel  sidebar-panel-active ">
      <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image"
        src="http://www.shutdown.cn/img/author.jpg"
        alt="不与天斗Domino" />
    <p class="site-author-name" itemprop="name">不与天斗Domino</p>
    <p class="site-description motion-element" itemprop="description"> 
        Programmer &amp; Architect</p>
</div>
      <nav class="site-state motion-element">
    <div class="site-state-item site-state-posts">
      <a href="http://www.shutdown.cn/post/">
        <span class="site-state-item-count">183</span>
        <span class="site-state-item-name">日志</span>
      </a>
    </div>
    <div class="site-state-item site-state-categories">    
        <a href="http://www.shutdown.cn/categories/">      
         
        <span class="site-state-item-count">15</span>
        
        <span class="site-state-item-name">分类</span>
        
        </a>
    </div>

    <div class="site-state-item site-state-tags">
        <a href="http://www.shutdown.cn/tags/">
         
        <span class="site-state-item-count">224</span>
        
        <span class="site-state-item-name">标签</span>
        </a>
    </div>
</nav>
      
      

      

      <div class="links-of-blogroll motion-element inline">
<script type="text/javascript" src="//rf.revolvermaps.com/0/0/8.js?i=&amp;m=0&amp;s=220&amp;c=ff0000&amp;cr1=ffffff&amp;f=arial&amp;l=33&amp;bv=35" async="async"></script>
</div>

    </section>
    
  </div>
</aside>

      </div>
    </main>
   
    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  <span itemprop="copyrightYear">  &copy; 
  2013 - 2023</span>
  <span class="with-love"><i class="fa fa-heart"></i></span>
  <span class="author" itemprop="copyrightHolder">天地维杰网</span>
  <span class="icp" itemprop="copyrightHolder"><a href="https://beian.miit.gov.cn/" target="_blank">京ICP备13019191号-1</a></span>
</div>
<div class="powered-by">
  Powered by - <a class="theme-link" href="http://gohugo.io" target="_blank" title="hugo" >Hugo v0.63.2</a>
</div>
<div class="theme-info">
  Theme by - <a class="theme-link" href="https://github.com/xtfly/hugo-theme-next" target="_blank"> NexT
  </a>
</div>


      </div>
    </footer>

    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
      <span id="scrollpercent"><span>0</span>%</span>
    </div>
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>
<script type="text/javascript" src="http://www.shutdown.cn/js/vendor/jquery/index.js?v=2.1.3"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/vendor/fastclick/lib/fastclick.min.js?v=1.0.6"></script> 
<script type="text/javascript" src="http://www.shutdown.cn/js/vendor/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/vendor/velocity/velocity.min.js?v=1.2.1"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/vendor/velocity/velocity.ui.min.js?v=1.2.1"></script>
<script src="http://www.shutdown.cn/js/vendor/ua-parser-js/dist/ua-parser.min.js?v=0.7.9"></script>

<script src="http://www.shutdown.cn/js/vendor/fancybox/jquery.fancybox.pack.js?v=2.1.5"></script>

<script type="text/javascript" src="http://www.shutdown.cn/js/utils.js"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/motion.js"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/affix.js"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/schemes/pisces.js"></script>

<script type="text/javascript" src="http://www.shutdown.cn/js/scrollspy.js"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/post-details.js"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/toc.js"></script>

<script type="text/javascript" src="http://www.shutdown.cn/js/bootstrap.js"></script>

<script type="text/javascript" src="http://www.shutdown.cn/js/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX", "output/HTML-CSS"],
    tex2jax: {
      inlineMath: [ ['$','$'] ],
      displayMath: [ ['$$','$$'] ],
      processEscapes: true
    },
    "HTML-CSS": { fonts: ["TeX"] }
  });
</script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML' async></script>
</body>
</html>